package com.wangyf.thread.c_006_usefinal;

import java.util.concurrent.TimeUnit;

/**
 * 使用final修饰锁
 * @author wangyf
 * @date 2021/1/2 16:26
 * 所以通常情况下 锁直接使用final修饰
 * 毕竟锁的信息是记录在对象的markword中，你对象都换了，那指定锁不住
 */
public class T {
    /*final*/ Object o = new Object();
    void run() {
        synchronized (o) {
            try {
                System.out.println(Thread.currentThread().getName()+": start");
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+": end");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        T t = new T();
        new Thread(t::run,"threadA").start();
        // 睡一秒 省的 线程A还未执行 o就已经被重新赋值 无法观测到 o被替换 锁失效的问题
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t.o = new Object();
        new Thread(t::run,"threadB").start();
    }
}
